package borrador.grafica;

import java.awt.Point;
import java.util.Iterator;

import javax.swing.UIManager;

import borrador.BoleteriaTeatro;
import borrador.grafica.TransformadorAGraficable;

import controlador.ControladorEditor;
import controlador.NoExisteEntidadGraficable;

import vista.objetos.AtributoGraficable;
import vista.objetos.AtributoTipoNoSoportadoException;
import vista.objetos.DiagramaGraficable;
import vista.objetos.EntidadGraficable;
import vista.objetos.EntidadTipoNoSoportadoException;
import vista.objetos.GraficableException;
import vista.objetos.ProyectoGraficable;
import vista.objetos.RelacionGraficable;
import vista.objetos.RelacionTipoNoSoportadoException;
import vista.paneles.hojaDibujo.OrientacionHoja;

import logica.*;

/*esto es para probar la carga de un proyecto. Hay pasos de más ya que tengo que setear a mano todas las
 * posiciones y las relaciones entre los diferentes objetos graficables*/

public class BoleteriaTeatroGraficable
{
	public ProyectoGraficable proyectoGraficable;

	public BoleteriaTeatroGraficable() throws AtributoRepetidoException, RelacionException, AtributoSimpleException, SinNombreException, IdExternoRepetidoException, AtributoIdentificadorFaltanteException, EntidadIdentificadoraFaltanteException, IdentificadorVacioException, AtributoTipoNoSoportadoException, EntidadTipoNoSoportadoException, RelacionTipoNoSoportadoException, NoExisteEntidadGraficable, IdExternoInexistenteException, EntidadRepetidaException, GraficableException
	{
		BoleteriaTeatro boleteria = new BoleteriaTeatro();
		
		/*creo el proyecto logico inicialmnt vacio por lo que tengo que crear un diagrama ppal*/
		Proyecto proyectoLogico = boleteria.getProyecto();
		
		/*para poder guardar el proyecto - sobreescribe archivos*/
		proyectoGraficable = TransformadorAGraficable.setInformacionParaGuardar(proyectoLogico);
		
		/*creo un proyecto graficable. Hay que convertir todos los diagramas logicos que tenga
		 * a diagramas graficables, en este caso solo es uno solo porq está vacío el proyecto */
		DiagramaGraficable diagramaGraficable = new DiagramaGraficable(proyectoLogico.getDiagramaPpal());
		diagramaGraficable.setOrientacion(OrientacionHoja.SENTIDO_HORIZONTAL);
		
		if(proyectoGraficable == null)
			proyectoGraficable = new ProyectoGraficable(proyectoLogico, diagramaGraficable);
		else
		{
			proyectoGraficable.setDiagramaPpal(diagramaGraficable);
			proyectoGraficable.setDiagramaActual(diagramaGraficable);
			proyectoGraficable.setProyecto(proyectoLogico);
		}
		
		/*a partir de ahora agrego los objetos graficables al diagrama graficable*/
		
		/*para las entidades es necesario setear por fuera la lista de atributos graficables*/
				
		EntidadGraficable entidadSeccionSala = crearEntidadGraficableSeccionSala(boleteria);
		EntidadGraficable entidadLocalidad = crearEntidadGraficableLocalidad(boleteria);
		EntidadGraficable entidadObra = crearEntidadGraficableObra(boleteria);
		EntidadGraficable entidadFuncion = crearEntidadGraficableFuncion(boleteria);
		
		/*agrego las entidades al diagrama actual*/
		proyectoGraficable.getDiagramaActual().agregarGraficable(entidadSeccionSala);
		proyectoGraficable.getDiagramaActual().agregarGraficable(entidadLocalidad);
		proyectoGraficable.getDiagramaActual().agregarGraficable(entidadObra);
		proyectoGraficable.getDiagramaActual().agregarGraficable(entidadFuncion);


		/*para las relaciones hace falta setear por fuera:
		 * 			- la lista de atributos graficables
		 * 			- la lista de entidades roles
		 */
		RelacionGraficable SL = crearRelacionGraficableSL(boleteria);
		RelacionGraficable VtaLoc = crearRelacionGraficableVtaLoc(boleteria);
		RelacionGraficable FO = crearRelacionGraficable(boleteria);

		
		/*agrego las realciones al diagrama*/
		proyectoGraficable.getDiagramaActual().agregarGraficable(SL);
		proyectoGraficable.getDiagramaActual().agregarGraficable(VtaLoc);
		proyectoGraficable.getDiagramaActual().agregarGraficable(FO);

		/*ahora agrego las referencias externas a las entidades
		 * No se puede agregar antes porque si la entidad tiene referencia
		 * a otra entidad (referencia externa) necesita que exista la relación
		 * que vincula ambas entidades para poder crear el identificador.*/
		entidadSeccionSala.setReferenciasExternas(proyectoGraficable.getDiagramaActual());
		entidadLocalidad.setReferenciasExternas(proyectoGraficable.getDiagramaActual());
		entidadObra.setReferenciasExternas(proyectoGraficable.getDiagramaActual());
		entidadFuncion.setReferenciasExternas(proyectoGraficable.getDiagramaActual());
		
		entidadSeccionSala.crearIdentificadores();
		entidadLocalidad.crearIdentificadores();
		entidadFuncion.crearIdentificadores();
		entidadObra.crearIdentificadores();

		ControladorEditor controlador = ControladorEditor.getInstancia();
		controlador.abrirVentanaEditor(proyectoGraficable);
	}

	private RelacionGraficable crearRelacionGraficable(BoleteriaTeatro boleteria) throws RelacionTipoNoSoportadoException,
			AtributoTipoNoSoportadoException, NoExisteEntidadGraficable, RelacionException, GraficableException {
		RelacionGraficable FO;
		FO = TransformadorAGraficable.getRelacionGraficable(boleteria.getFo());
		FO.getPunto().setLocation(new Point(550, 250));
		FO.setAtributos(TransformadorAGraficable.getAtributoGraficables(boleteria.getFo().getAtributos()));
		FO.setEntidadesRol(TransformadorAGraficable.getEntidadRolGraficables(boleteria.getFo().getEntidades(), proyectoGraficable.getDiagramaActual()));
		
		Iterator<AtributoGraficable> itAtriGraf = FO.getAtributos().iterator();
		int i = 0;
		
		while(itAtriGraf.hasNext())
		{
			AtributoGraficable atributo = itAtriGraf.next();
			
			atributo.getPunto().setLocation(new Point(500 + i * 70, 280 + i*20));
			i++;
		}
		
		return FO;
	}

	private RelacionGraficable crearRelacionGraficableVtaLoc(BoleteriaTeatro boleteria) throws RelacionTipoNoSoportadoException,
			AtributoTipoNoSoportadoException, NoExisteEntidadGraficable, RelacionException, GraficableException {
		RelacionGraficable VtaLoc;
		VtaLoc = TransformadorAGraficable.getRelacionGraficable(boleteria.getVtaLoc());
		VtaLoc.getPunto().setLocation(new Point(350, 250));
		VtaLoc.setAtributos(TransformadorAGraficable.getAtributoGraficables(boleteria.getVtaLoc().getAtributos()));
		VtaLoc.setEntidadesRol(TransformadorAGraficable.getEntidadRolGraficables(boleteria.getVtaLoc().getEntidades(), proyectoGraficable.getDiagramaActual()));
		
		Iterator<AtributoGraficable> itAtriGraf = VtaLoc.getAtributos().iterator();
		int i = 0;
		
		while(itAtriGraf.hasNext())
		{
			AtributoGraficable atributo = itAtriGraf.next();
			
			atributo.getPunto().setLocation(new Point(300 + i * 70, 200 + i*20));
			atributo.inicializarPosiciones();
			i++;
		}
		
		return VtaLoc;
	}

	private RelacionGraficable crearRelacionGraficableSL(BoleteriaTeatro boleteria) throws RelacionTipoNoSoportadoException,
			AtributoTipoNoSoportadoException, NoExisteEntidadGraficable, RelacionException, GraficableException {
		RelacionGraficable SL;
		SL = TransformadorAGraficable.getRelacionGraficable(boleteria.getSl());
		SL.getPunto().setLocation(new Point(100, 250));
		SL.setAtributos(TransformadorAGraficable.getAtributoGraficables(boleteria.getSl().getAtributos()));
		SL.setEntidadesRol(TransformadorAGraficable.getEntidadRolGraficables(boleteria.getSl().getEntidades(), proyectoGraficable.getDiagramaActual()));
		
		Iterator<AtributoGraficable> itAtriGraf = SL.getAtributos().iterator();
		int i = 0;
		
		while(itAtriGraf.hasNext())
		{
			AtributoGraficable atributo = itAtriGraf.next();
			
			atributo.getPunto().setLocation(new Point(100 + i * 70, 280 + i*20));
			i++;
		}
		
		return SL;
	}

	private EntidadGraficable crearEntidadGraficableFuncion(BoleteriaTeatro boleteria) throws EntidadTipoNoSoportadoException, AtributoTipoNoSoportadoException, IdExternoInexistenteException, GraficableException 
	{
		EntidadGraficable entidadFuncion = TransformadorAGraficable.getEntidadGraficable(boleteria.getFuncion());
		entidadFuncion.getPunto().setLocation(new Point(450, 350));
		entidadFuncion.setAtributos(TransformadorAGraficable.getAtributoGraficables(boleteria.getFuncion().getAtributos()));
		
		Iterator<AtributoGraficable> itAtriGraf = entidadFuncion.getAtributos().iterator();
		int i = 0;
		
		while(itAtriGraf.hasNext())
		{
			AtributoGraficable atributo = itAtriGraf.next();
			
			atributo.getPunto().setLocation(new Point(400 + i * 70, 370 + i*20));
			i++;
		}
		
		return entidadFuncion;
	}

	private EntidadGraficable crearEntidadGraficableObra(BoleteriaTeatro boleteria) throws EntidadTipoNoSoportadoException, AtributoTipoNoSoportadoException, IdExternoInexistenteException, GraficableException 
	{
		EntidadGraficable entidadObra = TransformadorAGraficable.getEntidadGraficable(boleteria.getObra());
		entidadObra.getPunto().setLocation(new Point(450, 150));
		entidadObra.setAtributos(TransformadorAGraficable.getAtributoGraficables(boleteria.getObra().getAtributos()));
		
		Iterator<AtributoGraficable> itAtriGraf = entidadObra.getAtributos().iterator();
		int i = 0;
		
		while(itAtriGraf.hasNext())
		{
			AtributoGraficable atributo = itAtriGraf.next();
			
			atributo.getPunto().setLocation(new Point(350 + i * 20, 150 - i*20));
			i++;
		}
		
		return entidadObra;
	}

	private EntidadGraficable crearEntidadGraficableLocalidad(BoleteriaTeatro boleteria) throws EntidadTipoNoSoportadoException, AtributoTipoNoSoportadoException, IdExternoInexistenteException, GraficableException 
	{
		EntidadGraficable entidadLocalidad = TransformadorAGraficable.getEntidadGraficable(boleteria.getLocalidad());
		entidadLocalidad.getPunto().setLocation(new Point(200, 350));
		entidadLocalidad.setAtributos(TransformadorAGraficable.getAtributoGraficables(boleteria.getLocalidad().getAtributos()));
		
		Iterator<AtributoGraficable> itAtriGraf = entidadLocalidad.getAtributos().iterator();
		int i = 0;
		
		while(itAtriGraf.hasNext())
		{
			AtributoGraficable atributo = itAtriGraf.next();
			
			atributo.getPunto().setLocation(new Point(150 + i * 70, 370 + i*20));
			i++;
		}
		
		return entidadLocalidad;
	}

	private EntidadGraficable crearEntidadGraficableSeccionSala(BoleteriaTeatro boleteria) throws EntidadTipoNoSoportadoException, AtributoTipoNoSoportadoException, IdExternoInexistenteException, GraficableException 
	{
		EntidadGraficable entidadSeccionSala = TransformadorAGraficable.getEntidadGraficable(boleteria.getSeccionSala());
		entidadSeccionSala.getPunto().setLocation(new Point(200, 150));
		entidadSeccionSala.setAtributos(TransformadorAGraficable.getAtributoGraficables(boleteria.getSeccionSala().getAtributos()));
		
		Iterator<AtributoGraficable> itAtriGraf = entidadSeccionSala.getAtributos().iterator();
		int i = 0;
		
		while(itAtriGraf.hasNext())
		{
			AtributoGraficable atributo = itAtriGraf.next();
			
			atributo.getPunto().setLocation(new Point(150 + i * 80, 100 + i*10));
			i++;
		}
		
		return entidadSeccionSala;
	}
	
	public static void main(String[] args) 
	{
		String l_f;
		l_f = "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";

		try {
			UIManager.setLookAndFeel(l_f);
			new BoleteriaTeatroGraficable();
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}
	